<?php

namespace Medicina\KernelBundle\Entity;

use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\Validator\Constraints as Assert;
use Symfony\Bridge\Doctrine\Validator\Constraints as DoctrineAssert;
use Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity;
use \DateTime;

/**
 * Medicina\KernelBundle\Entity\Concurso
 *
 * @ORM\Table(name="concurso")
 * @ORM\Entity(repositoryClass="Medicina\KernelBundle\Entity\ConcursoRepository")
 * @UniqueEntity(fields={"numeroExpediente"}, message="El valor ingresado ya existe. Debe ingresar uno nuevo")
 * @ORM\HasLifecycleCallbacks
 * 
 */
class Concurso {

    /**
     * @ORM\Column(name="id", type="integer", nullable=false)
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="IDENTITY")
     */
    private $id;

    /**
     * @ORM\Column(name="fechaInicioExpediente", type="datetime", nullable=false)
     */
    private $fechaInicioExpediente;

    /**
     * @ORM\Column(name="fechaCierre", type="date", nullable=true)
     */
    private $fechaCierre;

    /**
     * @ORM\Column(name="fechaInicioInscripcion", type="date", nullable=true)
     */
    private $fechaInicioInscripcion;

    /**
     * @ORM\Column(name="fechaEvaluacion", type="date", nullable=true)
     */
    private $fechaEvaluacion;

    /**
     * @ORM\Column(name="fechaEntregaActa", type="datetime", nullable=true)
     */
    private $fechaEntregaActa;

    /**
     * @ORM\Column(name="numeroExpediente", type="integer", length=10, nullable=false, unique=true)
     */
    private $numeroExpediente;

    /**
     * @ORM\Column(name="cerrado", type="boolean", nullable=true)
     */
    private $cerrado;

    /**
     * @ORM\OneToMany(targetEntity="ConcursoOficina", mappedBy="concurso", cascade={"persist" ,"remove"})
     * @ORM\OrderBy({"fechaInicioExpediente" = "DESC"})
     */
    private $oficinas;

    /**
     * @ORM\OneToMany(targetEntity="PersonaAsesora", mappedBy="concurso", cascade={"persist","remove"})
     */
    private $asesores;

    /**
     * @ORM\OneToMany(targetEntity="PersonaInscripta", mappedBy="concurso", cascade={"persist","remove"})
     */
    private $inscriptos;

    /**
     *  @ORM\ManyToMany(targetEntity="Cargo",  inversedBy="concursos",cascade={"persist"})
     *  @ORM\JoinTable(name="cargo_concurso",
     *      joinColumns={ @ORM\JoinColumn(name="concurso_id", referencedColumnName="id")},
     *      inverseJoinColumns={ @ORM\JoinColumn(name="cargo_id", referencedColumnName="id")}
     *      )
     */
    private $cargos;

    /**
     *  @ORM\OneToMany(targetEntity="Impugnacion", mappedBy="concurso" , cascade={"persist","remove"})
     */
    private $impugnaciones;

    /**
     *  @ORM\OneToMany(targetEntity="Resolucion", mappedBy="concurso", cascade={"persist","remove"})
     */
    private $resoluciones;

    /**
     * @ORM\ManyToOne(targetEntity="Catedra", inversedBy="concursos" , cascade={"persist"})
     * @ORM\JoinColumn(name="catedra_id", referencedColumnName="id")
     * 
     */
    private $catedra;
    private $virtualSearchFechaDesde;
    private $virtualSearchFechaHasta;

    public function __construct() {
        $this->oficinas = new \Doctrine\Common\Collections\ArrayCollection();
        $this->asesores = new \Doctrine\Common\Collections\ArrayCollection();
        $this->inscriptos = new \Doctrine\Common\Collections\ArrayCollection();
        $this->cargos = new \Doctrine\Common\Collections\ArrayCollection();
        $this->impugnaciones = new \Doctrine\Common\Collections\ArrayCollection();
        $this->resoluciones = new \Doctrine\Common\Collections\ArrayCollection();
        $this->ganadores = new \Doctrine\Common\Collections\ArrayCollection();
    }

    /**
     * @ORM\PrePersist()
     * @ORM\PreUpdate()
     */
    public function preUpdate() {
        if ($this->getFechaCierre() !== null) {
            $this->setCerrado(true);
        } else {
            $this->setCerrado(false);
        }
    }

    /**
     * Get id
     *
     * @return integer 
     */
    public function getId() {
        return $this->id;
    }

    /**
     * Set fechaInicioExpediente
     *
     * @param datetime $fechaInicioExpediente
     */
    public function setFechaInicioExpediente($fechaInicioExpediente) {
        $this->fechaInicioExpediente = $fechaInicioExpediente;
    }

    /**
     * Get fechaInicioExpediente
     *
     * @return datetime 
     */
    public function getFechaInicioExpediente() {
        return $this->fechaInicioExpediente;
    }

    /**
     * Set fechaCierre
     *
     * @param date $fechaCierre
     */
    public function setFechaCierre($fechaCierre) {
        $this->fechaCierre = $fechaCierre;
    }

    /**
     * Get fechaCierre
     *
     * @return date 
     */
    public function getFechaCierre() {
        return $this->fechaCierre;
    }

    /**
     * Set fechaInicioInscripcion
     *
     * @param date $fechaInicioInscripcion
     */
    public function setFechaInicioInscripcion($fechaInicioInscripcion) {
        $this->fechaInicioInscripcion = $fechaInicioInscripcion;
    }

    /**
     * Get fechaInicioInscripcion
     *
     * @return date 
     */
    public function getFechaInicioInscripcion() {
        return $this->fechaInicioInscripcion;
    }

    /**
     * Set fechaEvaluacion
     *
     * @param date $fechaEvaluacion
     */
    public function setFechaEvaluacion($fechaEvaluacion) {
        $this->fechaEvaluacion = $fechaEvaluacion;
    }

    /**
     * Get fechaEvaluacion
     *
     * @return date 
     */
    public function getFechaEvaluacion() {
        return $this->fechaEvaluacion;
    }

    /**
     * Set fechaEntregaActa
     *
     * @param datetime $fechaEntregaActa
     */
    public function setFechaEntregaActa($fechaEntregaActa) {
        $this->fechaEntregaActa = $fechaEntregaActa;
    }

    /**
     * Get fechaEntregaActa
     *
     * @return datetime 
     */
    public function getFechaEntregaActa() {
        return $this->fechaEntregaActa;
    }

    /**
     * Set numeroExpediente
     *
     * @param integer $numeroExpediente
     */
    public function setNumeroExpediente($numeroExpediente) {
        $this->numeroExpediente = $numeroExpediente;
    }

    /**
     * Get numeroExpediente
     *
     * @return integer 
     */
    public function getNumeroExpediente() {
        return $this->numeroExpediente;
    }

    /**
     * Set cerrado
     *
     * @param boolean $cerrado
     */
    public function setCerrado($cerrado) {
        $this->cerrado = $cerrado;
        if (!$cerrado) {
            $this->setFechaCierre(null);
        }
    }

    /**
     * Get cerrado
     *
     * @return boolean 
     */
    public function getCerrado() {
        return $this->cerrado;
    }

    /**
     * Add oficinas
     *
     * @param Medicina\KernelBundle\Entity\ConcursoOficina $oficinas
     */
    public function addConcursoOficina(\Medicina\KernelBundle\Entity\ConcursoOficina $oficinas) {
        $this->oficinas[] = $oficinas;
    }

    /**
     * Get oficinas
     *
     * @return Doctrine\Common\Collections\Collection 
     */
    public function getOficinas() {
        return $this->oficinas;
    }

    public function addHistoricoOficinas(\Medicina\KernelBundle\Entity\ConcursoOficina $concursoOficina) {
        $this->oficinas[] = $concursoOficina;
    }

    public function setOficina($oficina) {
        $concursoOficina = new ConcursoOficina();
        $concursoOficina->setConcurso($this);
        $concursoOficina->setOficina($oficina);
        $concursoOficina->setFechaInicioExpediente(new \DateTime('now'));
        $this->addHistoricoOficinas($concursoOficina);
    }

    public function getOficina() {
        $output = $this->oficinas->last();
        if ($output) {
            $output = $output->getOficina();
            return $output;
        }
    }

    /**
     * Add asesores
     *
     * @param Medicina\KernelBundle\Entity\PersonaAsesora $asesores
     */
    public function addPersonaAsesora(\Medicina\KernelBundle\Entity\PersonaAsesora $asesores) {
        $this->asesores[] = $asesores;
    }

    public function setAsesores($asesores) {
        foreach ($asesores as $asesor) {
            $asesor->setConcurso($this);
            $this->addPersonaAsesora($asesor);
        }
    }

    public function getAsesores() {
        return $this->asesores;
    }

    /**
     * Add inscriptos
     *
     * @param Medicina\KernelBundle\Entity\PersonaInscripta $inscriptos
     */
    public function addPersonaInscripta(\Medicina\KernelBundle\Entity\PersonaInscripta $inscriptos) {
        $this->inscriptos[] = $inscriptos;
    }

    public function setInscriptos($inscriptos) {

        foreach ($inscriptos as $inscripto) {
            $inscripto->setConcurso($this);
            $this->addPersonaInscripta($inscripto);
        }
    }

    public function getInscriptos() {
        return $this->inscriptos;
    }

    public function setCargos($cargos) {

        $this->cargos = $cargos;
    }

    public function getCargos() {
        return $this->cargos;
    }

    public function addImpugnacion(\Medicina\KernelBundle\Entity\Impugnacion $impugnaciones) {
        $this->impugnaciones[] = $impugnaciones;
    }

    public function setImpugnaciones($impugnaciones) {
        foreach ($impugnaciones as $impugnacion) {
            $impugnacion->setConcurso($this);
            $this->addImpugnacion($impugnacion);
        }
    }

    /**
     * Get impugnaciones
     *
     * @return Doctrine\Common\Collections\Collection 
     */
    public function getImpugnaciones() {
        return $this->impugnaciones;
    }

    public function addResolucion(\Medicina\KernelBundle\Entity\Resolucion $resoluciones) {
        $this->resoluciones[] = $resoluciones;
    }

    public function setResoluciones($resoluciones) {
        foreach ($resoluciones as $resolucion) {
            $resolucion->setConcurso($this);
            $this->addResolucion($resolucion);
        }
    }

    public function getResoluciones() {
        return $this->resoluciones;
    }

    /**
     * Set catedra
     *
     * @param Medicina\KernelBundle\Entity\Catedra $catedra
     */
    public function setCatedra($catedra) {

        if ($catedra === null) {
            return;
        }
        $this->catedra = $catedra;
    }

    /**
     * Get catedra
     *
     * @return Medicina\KernelBundle\Entity\Catedra 
     */
    public function getCatedra() {
        return $this->catedra;
    }

    /**
     * Add cargos
     *
     * @param Medicina\KernelBundle\Entity\Cargo $cargos
     */
    public function addCargo(\Medicina\KernelBundle\Entity\Cargo $cargos) {
        $this->cargos[] = $cargos;
    }

    public function esBorrable() {
        return true;
        return $this->getCargos()->isEmpty();
    }

    public function getVirtualSearchFechaDesde() {
        return $this->virtualSearchFechaDesde;
    }

    public function setVirtualSearchFechaDesde($fechaDesde) {
        $this->virtualSearchFechaDesde = $fechaDesde;
    }

    public function getVirtualSearchFechaHasta() {
        return $this->virtualSearchFechaHasta;
    }

    public function setVirtualSearchFechaHasta($fechaHasta) {
        $this->virtualSearchFechaHasta = $fechaHasta;
    }

    public function estaImpugnado() {
        $output = false;
        $impugnaciones = $this->getImpugnaciones();
        foreach ($impugnaciones as $impugnacion) {
            $output = $output || $impugnacion->getAceptada();
        }

        return $output;
    }

    public function getInscriptosGanadores() {
        $inscriptos = $this->getInscriptos();
        $ganadores = new \Doctrine\Common\Collections\ArrayCollection();
        foreach ($inscriptos as $inscripto) {
            if ($inscripto->getGano()) {
                $ganadores[] = $inscripto;
            }
        }
        return $ganadores;
    }

    public function setInscriptosGanadores($concursoId, $cargos) {
        $ganadoresAux = array();
        $cargosAux = array();

        $ganadores = $this->getInscriptosGanadores();

        $i = 0;
        foreach ($ganadores as $ganador) {
            if ($ganador) {
                if (isset($cargos[$i])) {
                    $cargo = new \Medicina\KernelBundle\Entity\Cargo;
                    $cargo = $cargos[$i];

                    $idCargo = $cargo->getId();
                    $idPersona = $ganador->getPersona()->getId();

                    if (!in_array($idPersona, $ganadoresAux) && !in_array($idCargo, $cargosAux)) {
                        $fechaNoti = $ganador->getFechaNotificacion();
                        $fechaAux = $fechaNoti->format('Y-m-j');

                        $duracion = $cargo->getTipoDeCargo()->getDuracion();
                        $fechaFinal = date("Y-m-j", strtotime($fechaAux . " +" . $duracion . " years"));
                        $fechaFinal = new DateTime($fechaFinal);

                        $persona = new \Medicina\KernelBundle\Entity\PersonaOcupaCargo;
                        $persona->setPersona($ganador->getPersona());
                        $persona->setFechaInicio($fechaNoti);
                        $persona->setFechaFin($fechaFinal);
                        $persona->setCargo($cargo);
                        $persona->setRenueva(0);
                        $persona->setConcursoId($concursoId);
                        $cargo->addPersonaOcupaCargo($persona);

                        $cargosAux[] = $idCargo;
                        $ganadoresAux[] = $idPersona;
                    }
                }
                $i = ++$i;
            }
        }
    }

    /**
     * Add ganadores
     *
     * @param Medicina\KernelBundle\Entity\PersonaOcupaCargo $ganadores
     */
    public function addPersonaOcupaCargo(\Medicina\KernelBundle\Entity\PersonaOcupaCargo $ganadores) {
        $this->ganadores[] = $ganadores;
    }

    /**
     * Get ganadores
     *
     * @return Doctrine\Common\Collections\Collection 
     */
    public function getGanadores() {
        return $this->ganadores;
    }

}